Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/kml/KmlGeoJson.kt renovate/fastlane-2.x-lockfile (056eed64) Text, 5.67 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.map.kml

Tff7b72import T7ee787org.meshtastic.feature.map.geojson.sanitizeImportedIconUrl
Tff7b72import T7ee787kotlin.math.roundToLong

T8b949e/** One GeoJSON feature, with the placemark's text and the style's colours as simplestyle properties. */
Tff7b72internal Tff7b72fun Te6edf3KmlGeometryTb4b4b4.Td2a8fftoFeatureTb4b4b4(Te6edf3placemarkTb4b4b4: Te6edf3PlacemarkTb4b4b4, Te6edf3styleTb4b4b4: Te6edf3KmlStyle?Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3properties Tff7b72= Te6edf3mutableListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Te6edf3placemarkTb4b4b4.Te6edf3nameTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6fftitleTa5d6ff\"Ta5d6ff:Tffd700${Tffa657itTb4b4b4.Te6edf3jsonStringTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff" Tb4b4b4}
Te6edf3placemarkTb4b4b4.Te6edf3descriptionTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6ffdescriptionTa5d6ff\"Ta5d6ff:Tffd700${Tffa657itTb4b4b4.Te6edf3jsonStringTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff" Tb4b4b4}

Te6edf3styleTff7b72?.Te6edf3lineColorTff7b72?.Te6edf3toCssColorTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Tb4b4b4(Te6edf3hexTb4b4b4, Te6edf3opacityTb4b4b4) Tff7b72-Tff7b72>
Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6ffstrokeTa5d6ff\"Ta5d6ff:Ta5d6ff\"Tffd700$Te6edf3hexTa5d6ff\"Ta5d6ff"
Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6ffstroke-opacityTa5d6ff\"Ta5d6ff:Tffd700$Te6edf3opacityTa5d6ff"
Tb4b4b4}
Te6edf3styleTff7b72?.Te6edf3lineWidthTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6ffstroke-widthTa5d6ff\"Ta5d6ff:Tffd700$Te6edf3itTa5d6ff" Tb4b4b4}
T8b949e// Only a point is drawn as an icon, and only this converter emits the key — simplestyle has no property for an
T8b949e// arbitrary image URL, so `icon-url` is ours rather than something a foreign file will carry.
Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffPointTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3styleTff7b72?.Te6edf3iconHrefTff7b72?.Te6edf3letTb4b4b4(Tff7b72::Te6edf3sanitizeImportedIconUrlTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{
Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Tffd700$Te6edf3ICON_URL_PROPERTYTa5d6ff\"Ta5d6ff:Tffd700${Tffa657itTb4b4b4.Te6edf3jsonStringTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isPolygonal Tff7b72&Tff7b72& Te6edf3styleTff7b72?.Te6edf3filled Tff7b72!Tff7b72= Tff7b72falseTb4b4b4) Tb4b4b4{
Te6edf3styleTff7b72?.Te6edf3fillColorTff7b72?.Te6edf3toCssColorTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Tb4b4b4(Te6edf3hexTb4b4b4, Te6edf3opacityTb4b4b4) Tff7b72-Tff7b72>
Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6fffillTa5d6ff\"Ta5d6ff:Ta5d6ff\"Tffd700$Te6edf3hexTa5d6ff\"Ta5d6ff"
Te6edf3properties Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff\"Ta5d6fffill-opacityTa5d6ff\"Ta5d6ff:Tffd700$Te6edf3opacityTa5d6ff"
Tb4b4b4}
Tb4b4b4}

Tff7b72return Ta5d6ff"Ta5d6ff{Ta5d6ff\"Ta5d6fftypeTa5d6ff\"Ta5d6ff:Ta5d6ff\"Ta5d6ffFeatureTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffpropertiesTa5d6ff\"Ta5d6ff:{Tffd700${Te6edf3propertiesTb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Tb4b4b4,Ta5d6ff"Tb4b4b4)Tffd700}Ta5d6ff},Ta5d6ff" Tff7b72+
Ta5d6ff"Ta5d6ff\"Ta5d6ffgeometryTa5d6ff\"Ta5d6ff:{Ta5d6ff\"Ta5d6fftypeTa5d6ff\"Ta5d6ff:Ta5d6ff\"Tffd700$Te6edf3typeTa5d6ff\"Ta5d6ff,Ta5d6ff\"Ta5d6ffcoordinatesTa5d6ff\"Ta5d6ff:Tffd700$Te6edf3coordinatesTa5d6ff}}Ta5d6ff"
Tb4b4b4}

T8b949e/**
* A KML colour is `aabbggrr` — alpha first and the channels in the reverse of CSS order.
*
* Returns the `#rrggbb` CSS hex plus the alpha as a 0..1 opacity, because simplestyle carries the two separately.
* Reading these in KML's own byte order is the single easiest thing to get wrong here: it turns red into blue.
*/
Tff7b72internal Tff7b72fun Te6edf3StringTb4b4b4.Td2a8fftoCssColorTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Tffa657StringTb4b4b4, Tffa657StringTff7b72>Tff7b72? Tb4b4b4{
Tff7b72val Te6edf3bytes Tff7b72=
Te6edf3removePrefixTb4b4b4(Ta5d6ff"Ta5d6ff#Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3length Tff7b72=Tff7b72= Te6edf3KML_COLOR_LENGTH Tb4b4b4}Tff7b72?.Te6edf3chunkedTb4b4b4(Te6edf3BYTE_CHARSTb4b4b4)Tff7b72?.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toIntOrNullTb4b4b4(Te6edf3HEXTb4b4b4) Tb4b4b4}
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3bytes Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3bytesTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657it Tff7b72=Tff7b72= Tff7b72null Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3opacity Tff7b72= Te6edf3bytesTff7b72[Te6edf3ALPHATff7b72]Tff7b72!!Tb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3MAX_CHANNEL
T8b949e// Rendered digit by digit rather than through a format string. This is JSON, not display text, and a
T8b949e// locale-aware `%f` writes `"fill-opacity":0,498` on a comma-decimal device — invalid JSON, which makes
T8b949e// MapLibre reject the whole converted file so every KML import silently draws nothing. The previous
T8b949e// implementation pinned Locale.US to avoid that; building the text by hand cannot regress into it, and works
T8b949e// the same on every platform.
Ta5d6ff"Ta5d6ff#Tffd700${Te6edf3bytesTff7b72[Te6edf3REDTff7b72]Tff7b72!!Tb4b4b4.Te6edf3hexByteTb4b4b4(Tb4b4b4)Tffd700}Tffd700${Te6edf3bytesTff7b72[Te6edf3GREENTff7b72]Tff7b72!!Tb4b4b4.Te6edf3hexByteTb4b4b4(Tb4b4b4)Tffd700}Tffd700${Te6edf3bytesTff7b72[Te6edf3BLUETff7b72]Tff7b72!!Tb4b4b4.Te6edf3hexByteTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff" Te6edf3to Te6edf3opacityTb4b4b4.Te6edf3toFixedTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

T8b949e/** Minimal JSON string escaping — KML descriptions routinely carry quotes, newlines and CDATA-wrapped HTML. */
Tff7b72internal Tff7b72fun Te6edf3StringTb4b4b4.Td2a8ffjsonStringTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3escaped Tff7b72= Te6edf3StringBuilderTb4b4b4(Ta5d6ff"Ta5d6ff\"Ta5d6ff"Tb4b4b4)
Te6edf3forEach Tb4b4b4{ Te6edf3character Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4{
Te6edf3character Tff7b72=Tff7b72= Ta5d6ff'"' Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ff\"Ta5d6ff"Tb4b4b4)
Te6edf3character Tff7b72=Tff7b72= Ta5d6ff'\\' Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ff\\Ta5d6ff"Tb4b4b4)
Te6edf3character Tff7b72=Tff7b72= Ta5d6ff'\n' Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ffnTa5d6ff"Tb4b4b4)
Te6edf3character Tff7b72=Tff7b72= Ta5d6ff'\r' Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ffrTa5d6ff"Tb4b4b4)
Te6edf3character Tff7b72=Tff7b72= Ta5d6ff'\t' Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6fftTa5d6ff"Tb4b4b4)
Te6edf3character Tff7b72< Ta5d6ff' ' Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ffuTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3appendTb4b4b4(Te6edf3characterTb4b4b4.Te6edf3codeTb4b4b4.Te6edf3toStringTb4b4b4(Te6edf3HEXTb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(Te6edf3ESCAPE_DIGITSTb4b4b4, Ta5d6ff'0'Tb4b4b4)Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3characterTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3escapedTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff'"'Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}

T8b949e/**
* The property an icon image URL is written to.
*
* Deliberately named rather than borrowed: simplestyle-spec 1.1.0 defines `marker-symbol` (a fixed icon vocabulary),
* `marker-color` and `marker-size`, and nothing for an arbitrary image. This is an extension of ours, so it is declared
* in one place and documented as such.
*/
Tff7b72const Tff7b72val Te6edf3ICON_URL_PROPERTY Tff7b72= Ta5d6ff"Ta5d6fficon-urlTa5d6ff"

T8b949e/** A JSON `\uXXXX` escape is always four hex digits. */
Tff7b72private Tff7b72const Tff7b72val Te6edf3ESCAPE_DIGITS Tff7b72= T79c0ff4

Tff7b72private Tff7b72const Tff7b72val Te6edf3KML_COLOR_LENGTH Tff7b72= T79c0ff8
Tff7b72private Tff7b72const Tff7b72val Te6edf3BYTE_CHARS Tff7b72= T79c0ff2
Tff7b72private Tff7b72const Tff7b72val Te6edf3HEX Tff7b72= T79c0ff1T79c0ff6
Tff7b72private Tff7b72const Tff7b72val Te6edf3MAX_CHANNEL Tff7b72= T79c0ff2T79c0ff5T79c0ff5.0

T8b949e// A KML colour is aabbggrr: alpha first, then the channels in the reverse of CSS order.
Tff7b72private Tff7b72const Tff7b72val Te6edf3ALPHA Tff7b72= T79c0ff0
Tff7b72private Tff7b72const Tff7b72val Te6edf3BLUE Tff7b72= T79c0ff1
Tff7b72private Tff7b72const Tff7b72val Te6edf3GREEN Tff7b72= T79c0ff2
Tff7b72private Tff7b72const Tff7b72val Te6edf3RED Tff7b72= T79c0ff3

T8b949e/** One byte as two lowercase hex digits, the way a CSS colour wants it. */
Tff7b72private Tff7b72fun Te6edf3IntTb4b4b4.Td2a8ffhexByteTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3toStringTb4b4b4(Te6edf3HEXTb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(Te6edf3BYTE_CHARSTb4b4b4, Ta5d6ff'0'Tb4b4b4)

T8b949e/** Three decimal places, written out rather than formatted, so no locale can put a comma in the JSON. */
Tff7b72private Tff7b72fun Te6edf3DoubleTb4b4b4.Td2a8fftoFixedTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3scaled Tff7b72= Tb4b4b4(Tff7b72this Tff7b72* Te6edf3OPACITY_SCALETb4b4b4)Tb4b4b4.Te6edf3roundToLongTb4b4b4(Tb4b4b4)
Tff7b72return Ta5d6ff"Tffd700${Te6edf3scaled Tff7b72/ Te6edf3OPACITY_SCALETffd700}Ta5d6ff.Tffd700${Tb4b4b4(Te6edf3scaled Tff7b72% Te6edf3OPACITY_SCALETb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(Te6edf3OPACITY_DECIMALSTb4b4b4, Ta5d6ff'0'Tb4b4b4)Tffd700}Ta5d6ff"
Tb4b4b4}

Tff7b72private Tff7b72const Tff7b72val Te6edf3OPACITY_SCALE Tff7b72= T79c0ff1T79c0ff0T79c0ff0T79c0ff0L
Tff7b72private Tff7b72const Tff7b72val Te6edf3OPACITY_DECIMALS Tff7b72= T79c0ff3

Served by rngit 1.5.2 - Generated in 0.17s